package main

import (
	"context"
	"fmt"
	"io"
	"net"

	"gitee.com/go-course/grpc-demo/grpc/auth"
	"gitee.com/go-course/grpc-demo/grpc/protocol"
	"google.golang.org/grpc"
)

type Service struct {
	protocol.UnimplementedHelloServiceServer
}

// 简单加个 hello 前缀
func (s *Service) Hello(ctx context.Context, req *protocol.Request) (
	*protocol.Response, error) {
	return &protocol.Response{
		Value: "hello: " + req.Value,
	}, nil
}

// server ---stream----> client
func (s *Service) Chat(stream protocol.HelloService_ChatServer) error {
	// 可以把stream 当成一个channel对象, io pipe

	for {
		// 接收客户端请求
		req, err := stream.Recv()
		if err != nil {
			if err == io.EOF {
				fmt.Println("chat exit")
				return nil
			}

			return err
		}

		// 处理请求
		if err := stream.Send(&protocol.Response{
			Value: "hello: " + req.Value,
		}); err != nil {
			fmt.Println(err)
		}
	}
}

func main() {
	// 如何把 Service 作为一个rpc 暴露出去, 提供服务
	server := grpc.NewServer(
		// 请求响应模式的 认证中间件
		grpc.UnaryInterceptor(auth.GrpcAuthUnaryServerInterceptor()),
		// stream模式的认证中间件
		grpc.StreamInterceptor(auth.GrpcAuthStreamServerInterceptor()),
	)

	// Service 生成的代码里面, 提供了注册函数, 把自己注册到 grpc的server内
	protocol.RegisterHelloServiceServer(server, new(Service))

	ls, err := net.Listen("tcp", "127.0.0.1:1234")
	if err != nil {
		panic(err)
	}

	if err := server.Serve(ls); err != nil {
		fmt.Println(err)
	}
}
